Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2014, 19:20
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

Заставить js-файл работать в браузере и в node.js
Здравствуйте!

Достаточно безумная задача.
Есть js-файлик с набором функций, написанный под браузер, нужно его под node.js портировать.
Без RequireJS, Grunt, сторонних библиотек и сборщиков.

Кроме того, внутри "модуля" нужно получить ссылку на глобальный объект (window в браузере, global в ноде).
Сразу код:

var MySuperModule = (function (exports, global, undefined) {
    "use strict";
    
    var mo = {},
        nativeObjectProto = global.Object.prototype,
        nativeToString = nativeObjectProto.toString;

    /**
     * @name MySuperModule.valueToString
     */
    mo.valueToString = function valueToString(value) {
        return nativeToString.call(value);
    };

    if (global !== exports) {
        exports.mo = mo;
    }

    return mo;
})(this, (function () {return this;})());


Глобальный объект получаю с помощью
(function () {return this;})() // функция по умолчанию вызывается в контексте global


this в node указывает на exports, в браузере на window.

Вопросы:

1. Можно это сделать покрасивее (в рамках условий задачи)?

2. Как полностью заменить exports на содержимое модуля? То есть сделать:
module.exports = mo;


Для этого нужно получить переменную module.
Нашёл два варианта:

eval.apply("module")

но за eval() и линчевать могут.

var module; // вверху


Второй вариант вполне работает и лишняя переменная ничему не мешает, даже если в браузере до этого был уже определён модуль.
Но всё равно как-то некрасиво лишнее определение делать.

Можно по-другому?
Ответить с цитированием
  #2 (permalink)  
Старый 13.11.2014, 00:34
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

Вот ещё вариант для второго пункта:
if ((typeof module === "object") && (module.exports === exports)) {
    module.exports = mo;
}


видимо, он самый православный.
единственно, обращение к необявленной переменной смущает.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить работать событие onLoad для embed slim-v Events/DOM/Window 0 16.09.2010 15:07
Заставить работать js подгружаемый AJAX -ом DeMONiZ AJAX и COMET 14 21.05.2010 10:52
как заставить jQuery работать с переменными gooody jQuery 1 19.02.2010 13:10
Как заставить работать оперу и мозилу? SDone AJAX и COMET 6 25.02.2009 16:05
Большой JS файл. Кэш IE6. deadpsh Общие вопросы Javascript 1 26.11.2008 23:38